<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>this测试</title>
</head>
<body>
  <script>
    /* 
    this有`四种绑定规则`
    - 默认绑定: 直接调用 => 严格模式下是undefined, 非严格模式下是window
    - 隐式绑定: 通过对象调用 => 对象
    - 显式绑定: 通过call/apply/bind调用 => 第一个参数对象
    - 构造函数绑定: 通过new调用 => new出来的对象
    */
    // 'use strict'
    
     
    function fn(a, b) {
      console.log('----', this)
    }
    // 直接调用 => window | undefined
    // fn()
    // new 调用  => 新创建的对象
    // new fn()
    // 对象调用 => 对象
    const o  = {fn2: fn}
    // o.fn2()
    // call/apply/bind调用 => 第一个参数对象
    // fn.call(o, 2, 3)
    // fn.apply(o, [2, 3])
    const fn3 = fn.bind(o)
    // console.log(fn3)
    fn3()
    console.log('----------22222')


   

    
    // 箭头函数  => 没有自己的this, 只能沿着作用域链, 去外部找this
    
    var n = 1
    var obj = { // 对象本身不产生作用域
      n: 2,
      m1: () => {
        console.log(this.n)
      },
      m2: function () {
        console.log(this.n)
      },
    }
    obj.m1()
    obj.m2()

    function fn() {
      var that = this
      function fn2() {
      // const fn2 = () => {
        // 在fn2中想用fn的this, 怎么办呢?
        
      }
    }

    console.log(console.toString) // 

    new Promise(function (resolve) {
      console.log('1111', this)
      resolve()
    }).then(function () {
      console.log('2222', this)
    })



  </script>

</body>
</html>